package com.mfs.proxy.core.message.processor;

import com.mfs.common.utills.ObjectUtil;
import com.mfs.proxy.core.enums.MessageTypeEnum;
import com.mfs.proxy.core.message.Message;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.SocketChannel;

/**
 * 消息发送处理器
 * 改处理器主要负责消息内容的组装、发送，针对不同的消息会调用不同的消息处理器进行处理
 *
 * @author mfs
 * @date 2023/7/1 22:30
 **/
public interface MessageSendProcessor<T> {
    /**
     * 消息发送
     * 入参定义比较宽泛，方便不同的消息类型传入不同数量、不同类型的参数。再使用时需要强转，不太优雅
     *
     * @param selectionKey 使用 selectionKey 发送
     * @param messageTypeEnum 消息类型
     * @param messageContent 消息内容
     * */
    default void send(SelectionKey selectionKey, MessageTypeEnum messageTypeEnum, T messageContent) throws IOException {
        SocketChannel communicationChanel = (SocketChannel)selectionKey.channel();
        Message message = new Message(messageTypeEnum.getType(), messageContent);
        ByteBuffer byteBuffer = ByteBuffer.wrap(ObjectUtil.serialize(message));
        communicationChanel.write(byteBuffer);
    }


}
